<template>
    <h2>当前求和为：{{sum}}</h2>
    <button @click="sum++">点我+1</button>

    <hr>
    <h2>当前的信息为：{{msg}}</h2>
    <button @click="msg += '!'">修改信息</button>

    <hr>
    <h2>姓名：{{person.name}}</h2>
    <h2>年龄：{{person.age}}</h2>
    <h2>薪资：{{person.job.j1.salary}} K</h2>
    <button @click="person.name+='~'">修改姓名</button>
    <button @click="person.age++">增长年龄</button>
    <button @click="person.job.j1.salary++">增长薪资</button>
</template>

<script>
    // Vue3中的computed 是一个组合式的api，所以需要通过import 进行引入。
    import { ref, reactive, watch } from 'vue';
    export default {
        name: 'Demo',
        setup() {
            // 数据
            let sum = ref(0);
            let msg = ref('我是一条信息');
            let person = reactive({
                name: '张三',
                age: 18,
                job: {
                    j1: {
                        salary: 20
                    }
                }
            });

            // 监视，使用watch 之前需要进行引入才可以
            // 情况一：监视ref所定义的一个响应式数据，watch监视ref定义的数据
            // 参数一：监视的谁
            // 参数二：监视的数据
            // 参数三：监视的配置
            // watch(sum, (newValue, OldValue) => {
            //     console.log('sum的值改变了', newValue, OldValue);
            // }, {
            //     immediate: true,// 初始化监视
            //     deep: true, // 深度监视
            // });

            // 情况二：监视ref所定义的多个响应式数据，watch监视ref定义的数据
            // 其中Vue3可以定义多个watch 进行使用
            // watch([sum, msg], (newValue, OldValue) => {
            //     console.log('sum或者msg变了', newValue, OldValue);
            // });

            // 情况三：监视reactive所定义的多个响应式数据，watch监视 reactive 定义的数据
            /* 
                情况三：监视reactive所定义的一个响应式数据的全部属性
                        1.注意：此处无法正确的获取oldValue
                        2.注意：强制开启了深度监视（deep配置无效）
            */
            // 注意：此处无法正确的获取到oldValue的值
            // watch(person, (newValue, OldValue) => {
            //     console.log('person变化了：', newValue, OldValue);
            // }, { deep: false }); //此处的deep配置无效 */

            // 情况四：监视reactive所定义的一个响应式数据中的某个属性
            // 此时，watch的参数一，要写成一个函数，可以是箭头函数，也可以是普通函数
            // 重点：watch 只能监视ref的值，或者reactive生成的响应式对象，或者是一个数组。
            // watch(() => person.name, (newValue, oldValue) => {
            //     console.log('person的name或者age变化了', newValue, oldValue);
            // });

            // 情况五：监视reactive所定义的一个响应式数据中的某些属性
            // watch([() => person.name, () => person.age], (newValue, oldValue) => {
            //     console.log('person的name或者age变化了', newValue, oldValue);
            // });

            // watch 特殊情况，仔细对比特殊情况和情况三
            watch(() => person.job, (newValue, oldValue) => {
                console.log('person的job变化了', newValue, oldValue);
            }, {
                deep: true // 此处，由于监视的是reactive定义的对象中的某个属性，所以deep配置还是有效的。
            });

            // 返回一个对象（常用）
            return {
                sum,
                msg,
                person
            }
        }
    }
</script>

<style>

</style>